/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package feuerwehr;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;

/**
 *
 * @author GundlaPe
 */
public class Person implements Comparable <Person> {
    public Person(int pk, String name, String vorname, Timestamp agt) {
        this.pk = pk;
        this.name = name;
        this.vorname = vorname;
        this.agt = agt;
    }
    
    /**
     * Eine einzelne Person laden
     * @param iPK PK der Person
     * @return Person Die jeweilige Person
     */
    public static Person getPerson(int iPK) {
        Person p = null;
        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement("select * from t_person where pk = ?");
            ps.setInt(1, iPK);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                p = new Person(rs.getInt("pk"), rs.getString("name"), rs.getString("vorname"), null);
            }
            rs.close();
            ps.close();            
        } catch (SQLException exc) {
            System.err.println("ERROR[Person]: " + exc.toString());
        }
        return p;
    }

    /**
     * Liste aller leitenden Kraefte erstellen
     * @param iEinsatzPK Der Einsatz-PK
     * @return ArrayList Liste aller Personen die als Leiter eingesetzt waren
     */
    public static ArrayList getLeitendeKraefte(int iEinsatzPK) {
        String sSQL = "select tp.pk, tp.name, tp.vorname, tep.agt from t_person tp, t_e_person tep where tp.pk = tep.fk_person and tep.fk_einsatz = ? and tep.kz_einsatzleiter = 'J' order by tp.name, tp.vorname";
        return getSQLPersonen(sSQL, iEinsatzPK);
    }

    /**
     * Liste aller eingesetzten Kraefte erstellen
     * @param iEinsatzPK Der Einsatz-PK
     * @return ArrayList Liste aller Personen die eingesetzt waren
     */
    public static ArrayList getEingesetzteKraefte(int iEinsatzPK) {
        String sSQL = "select tp.pk, tp.name, tp.vorname, tep.agt from t_person tp, t_e_person tep where tp.pk = tep.fk_person and tep.fk_einsatz = ? and tep.kz_aktiv = 'J' order by tp.name, tp.vorname";
        return getSQLPersonen(sSQL, iEinsatzPK);
    }

     /**
     * Liste aller bereitgestellten Kraefte erstellen
     * @param iEinsatzPK Der Einsatz-PK
     * @return ArrayList Liste aller Personen die bereitgestellt waren
     */
    public static ArrayList getBereiteKraefte(int iEinsatzPK) {
        String sSQL = "select tp.pk, tp.name, tp.vorname, tep.agt from t_person tp, t_e_person tep where tp.pk = tep.fk_person and tep.fk_einsatz = ? and tep.kz_bereit = 'J' order by tp.name, tp.vorname";
        return getSQLPersonen(sSQL, iEinsatzPK);
    }   

    /**
     * Liste aller freien Personen für diesen Einsatz erstellen
     * @param iEinsatzPK Der Einsatz-PK
     * @return  ArrayList Liste aller Personen die frei sind
     */
    public static ArrayList getFreieKraefte(int iEinsatzPK) {
        String sSQL = "select pk, name, vorname, null agt from t_person where pk not in (select fk_person from t_e_person where fk_einsatz = ?) order by name, vorname";
        return getSQLPersonen(sSQL, iEinsatzPK);
    }
   
    private static ArrayList <Person> getSQLPersonen(String strSQL, int iEinsatzPK) {
        ArrayList <Person> al = new ArrayList();
        try {
            PreparedStatement ps = Feuerwehr.getConnection().prepareStatement(strSQL);
            ps.setInt(1, iEinsatzPK);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Person p = new Person(rs.getInt("pk"), rs.getString("name"), rs.getString("vorname"), rs.getTimestamp("agt"));
                al.add(p);
            }
            rs.close();
            ps.close();            
        } catch (SQLException exc) {
            System.err.println("ERROR[Person]: " + exc.toString());
        }
        return al;
    }
    
    /**
     * Den PK der Person zurückgeben.
     * @return PK
     */
    public String getPK() {
        return String.valueOf(pk);
    }
    
    /**
     * Den name der Person zurückgeben.
     * @return PK
     */
    public String getName() {
        return vorname + " " + name;
    }

    /**
     * Die Zeit für das Atemschutzgerät zurückgeben.
     * @return Die Zeit ausgedrückt in HH:MM
     */
    public String getAGT() {
        if (agt != null) {
            return Feuerwehr.formatDatum(agt, "HH:mm");   
        }
        return "";
    }
    
    public void setAGT(String s) {
        agt=Einsatz.getSQLDateFromString(s, "HH:mm");
    }

    /**
     * Eigenes toString() für Darstellung in JListen
     * @return String
     */
    @Override
    public String toString() {
        return name + ", " + vorname;
    }
    
    /**
     * Vergleichsmöglichkeit mit comparable()
     * @param t Person
     * @return int
     */
    @Override
    public int compareTo(Person t) {
        return toString().compareTo(t.toString());
    }
    
    private Timestamp agt;
    private final String name;
    private final String vorname;
    private final int pk;
}
